home *** CD-ROM | disk | FTP | other *** search
/ Stone Design / Stone Design.iso / Stone_Friends / NeXT-Icons / next-icon@gun.com / Apps / ImagePortfolio / ExpandImage.cxx < prev    next >
Encoding:
C/C++ Source or Header  |  1993-06-03  |  7.5 KB  |  254 lines

  1. // -------------------------------------------------------------------------------------
  2. // LargeImage.cxx
  3. // -------------------------------------------------------------------------------------
  4. // Permission is granted to freely redistribute this source code, and to use fragments
  5. // of this code in your own applications if you find them to be useful.  This class,
  6. // along with the source code, come with no warranty of any kind, and the user assumes
  7. // all responsibility for its use.
  8. // -------------------------------------------------------------------------------------
  9.  
  10. extern "Objective-C" {
  11. #import <objc/objc.h>
  12. #import <appkit/appkit.h>
  13. #import <libc.h>
  14. #import <stdlib.h>
  15. #import <stdio.h>
  16. #import <string.h>
  17. #import <math.h>
  18. #import <sys/time.h>
  19. #import <defaults/defaults.h>
  20. #import <dpsclient/psops.h>
  21. #import <dpsclient/dpsNeXT.h>
  22. }
  23.  
  24. #import "ExpandImage.h"
  25. #import "ExpandedView.h"
  26.  
  27. // -------------------------------------------------------------------------------------
  28. #define    X                origin.x
  29. #define    Y                origin.y
  30. #define    W                size.width
  31. #define    H                size.height
  32.  
  33. // -------------------------------------------------------------------------------------
  34. @implementation ExpandImage
  35.  
  36. // -------------------------------------------------------------------------------------
  37. // instance management
  38.  
  39. /* init */
  40. - init
  41. {
  42.     NXRect    rect, controlRect, contentRect;
  43.     
  44.     /* init super */
  45.     [super init];
  46.     
  47.     /* load nib */
  48.     [NXApp loadNibSection:"ExpandImage.nib" owner:self];
  49.     imageMenu = [imagePopup target];
  50.     [[imageMenu setTarget:self] setAction:@selector(selectImageRep:)];
  51.     [[useAlphaSw setTarget:self] setAction:@selector(selectImageRep:)];
  52.     
  53.     /* init window */
  54.     [window setDelegate:self];
  55.     [window getFrame:&rect];
  56.     minWindowSize = rect.size;
  57.     [Window getContentRect:&contentRect forFrameRect:&rect style:[window style]];
  58.     minContentSize = contentRect.size;
  59.  
  60.     /* get control box height */
  61.     [controlBox getFrame:&controlRect];
  62.     controlHeight = controlRect.Y + controlRect.H;
  63.     
  64.     /* align imageScroller */
  65.     [imageScroller getFrame:&rect];
  66.     rect.X = 0.0;
  67.     rect.Y = controlHeight;
  68.     rect.W = minContentSize.width;
  69.     rect.H = minContentSize.height - controlHeight;
  70.     [imageScroller setFrame:&rect];
  71.     
  72.     return self;
  73. }
  74.  
  75. /* free */
  76. - free
  77. {
  78.     [window free];
  79.     return [super free];
  80. }
  81.  
  82. // -------------------------------------------------------------------------------------
  83. // show enlarged image
  84.  
  85. /* clear image */
  86. - clearImage
  87. {
  88.     [window orderOut:(id)nil];
  89.     [imageView setImage:(id)nil :(char*)nil];
  90.     return self;
  91. }
  92.  
  93. /* show specified image */
  94. - showImage:theImage:(const char*)fileName title:(const char*)title
  95. {
  96.     BOOL            scrollSw;
  97.     NXRect            imageRect;
  98.     static NXSize    maxSize, scrSize = { 0.0, 0.0 };
  99.  
  100.     /* init max screen size */
  101.     if (!scrSize.width) {
  102.         [NXApp getScreenSize:&scrSize];
  103.         maxSize.width  = floor(scrSize.width  * 0.80);
  104.         maxSize.height = floor(scrSize.height * 0.80);
  105.     }
  106.  
  107.     /* hide large panel and return if no image */
  108.     [window orderOut:self];
  109.     if (!theImage) return self;
  110.  
  111.     /* set panel image */
  112.     [imageView setImage:theImage :fileName];
  113.     
  114.     /* fill popUp */
  115.     id matrix = [imageMenu itemList];
  116.     [[[matrix renewRows:0 cols:0] cellList] freeObjects];
  117.     [imageMenu setItemList:matrix];
  118.     for (int i = 0, cnt = [[theImage representationList] count]; i < cnt; i++) {
  119.         id repId = [[theImage representationList] objectAt:i];
  120.         int bits = [repId bitsPerSample] * [repId numColors];
  121.         char desc[32];
  122.         if (bits == NX_MATCHESDEVICE) strcpy(desc, "device");
  123.         else sprintf(desc, "%d bit", bits);
  124.         [[imageMenu addItem:desc] setTag:i];
  125.         if (i == 0) [imagePopup setTitle:desc];
  126.     }
  127.  
  128.     /* set image rep (best representation) */
  129.     [self setImageRep:-1];
  130.  
  131.     /* resize panel */
  132.     NXRect fRect, contentRect;
  133.     [imageView getFrame:&imageRect];
  134.     contentRect = imageRect;
  135.     contentRect.X = contentRect.Y = 0.0;
  136.     contentRect.H += controlHeight;
  137.     if (contentRect.W < minContentSize.width ) contentRect.W = minContentSize.width ;
  138.     if (contentRect.H < minContentSize.height) contentRect.H = minContentSize.height;
  139.     [Window getFrameRect:&fRect forContentRect:&contentRect style:[window style]];
  140.     if ((fRect.W >= scrSize.width) || (fRect.H >= scrSize.height)) {
  141.         fRect.size = maxSize;
  142.         [self windowWillResize:window toSize:&(fRect.size)];
  143.         [Window getContentRect:&contentRect forFrameRect:&fRect style:[window style]];
  144.         scrollSw = YES;
  145.     } else {
  146.         scrollSw = NO;
  147.     }
  148.     [imageScroller setHorizScrollerRequired:scrollSw];
  149.     [imageScroller setVertScrollerRequired:scrollSw];
  150.     [window sizeWindow:contentRect.W :contentRect.H];
  151.  
  152.     /* resize imageView */
  153.     NXRect rect, scrollRect;
  154.     [imageScroller getFrame:&scrollRect];
  155.     [ScrollView getContentSize:&(rect.size) forFrameSize:&(scrollRect.size)
  156.         horizScroller:scrollSw vertScroller:scrollSw borderType:[imageScroller borderType]];
  157.     if (imageRect.W < rect.W) imageRect.W = rect.W;
  158.     if (imageRect.H < rect.H) imageRect.H = rect.H;
  159.     [imageView setFrame:&imageRect];
  160.  
  161.     /* show enlarged image */
  162.     [window setTitle:title];
  163.     [[[window center] display] makeKeyAndOrderFront:self];
  164.   
  165.     return self;
  166. }
  167.  
  168. /* set image rep */
  169. - setImageRep:(int)repNum
  170. {
  171.     id    menuList = [imageMenu itemList];
  172.     if (repNum < 0) repNum = [imageView bestRepIndex];
  173.     if (![menuList selectCellWithTag:repNum]) return (id)nil;
  174.     [imagePopup setTitle:[[menuList selectedCell] title]];
  175.     [useAlphaSw setEnabled:[imageView imageRepHasAlpha:repNum]];
  176.     [imageView setImageRep:repNum withAlpha:([useAlphaSw intValue]?YES:NO)];
  177.     [imageView display];
  178.     return self;
  179. }
  180.  
  181. /* image popup menu action (may be caled by non matrix) */
  182. - selectImageRep:sender
  183. {
  184.     id    cellId = [[imageMenu itemList] selectedCell];
  185.     [self setImageRep:[cellId tag]];
  186.     return self;
  187. }
  188.  
  189. // -------------------------------------------------------------------------------------
  190. // hide panel
  191.  
  192. /* order out */
  193. - orderOut:sender
  194. {
  195.     return [self clearImage];
  196. }
  197.  
  198. // -------------------------------------------------------------------------------------
  199. // expanded image window delegate methods
  200.  
  201. /* window is resizing */
  202. - windowWillResize:windowId toSize:(NXSize*)newSize
  203. {
  204.     
  205.     /* maximum content size */
  206.     NXRect contentRect, imageRect;
  207.     NXSize imageSize;
  208.     [imageView getFrame:&imageRect];
  209.     [[imageView image] getSize:&imageSize];
  210.     [ScrollView getFrameSize:&contentRect.size forContentSize:&imageSize
  211.         horizScroller:YES vertScroller:YES borderType:[imageScroller borderType]];
  212.     contentRect.X = contentRect.Y = 0.0;
  213.     contentRect.H += controlHeight;
  214.     
  215.     /* maximum window size */
  216.     NXRect maxRect;
  217.     [Window getFrameRect:&maxRect forContentRect:&contentRect style:[windowId style]];
  218.     if (newSize->width  > maxRect.W) newSize->width  = maxRect.W;
  219.     if (newSize->height > maxRect.H) newSize->height = maxRect.H;
  220.  
  221.     /* minimum window size */
  222.     if (newSize->width  < minWindowSize.width ) newSize->width  = minWindowSize.width ;
  223.     if (newSize->height < minWindowSize.height) newSize->height = minWindowSize.height;
  224.  
  225.     return self;
  226. }
  227.  
  228. /* window is resizing */
  229. - windowDidResize:windowId
  230. {
  231.  
  232.     /* put scrollers in scroll view */
  233.     [imageScroller setHorizScrollerRequired:YES];
  234.     [imageScroller setVertScrollerRequired:YES];
  235.  
  236.     /* resize imageView */
  237.     NXSize imageSize;
  238.     NXRect rect, scrollRect, imageRect;
  239.     [imageScroller getFrame:&scrollRect];
  240.     [ScrollView getContentSize:&(rect.size) forFrameSize:&(scrollRect.size)
  241.         horizScroller:YES vertScroller:YES borderType:[imageScroller borderType]];
  242.     [[imageView image] getSize:&imageSize];
  243.     [imageView getFrame:&imageRect];
  244.     if (imageRect.W > imageSize.width ) imageRect.W = imageSize.width ;
  245.     if (imageRect.H > imageSize.height) imageRect.H = imageSize.height;
  246.     if (imageRect.W < rect.W          ) imageRect.W = rect.W;
  247.     if (imageRect.H < rect.H          ) imageRect.H = rect.H;
  248.     [imageView setFrame:&imageRect];
  249.     
  250.     return self;
  251. }
  252.  
  253. @end
  254.